import axios from 'axios'

// 创建 axios 实例
const request = axios.create({
	baseURL: import.meta.env.VITE_API_BASE_URL,
	timeout: 10000, // 请求超时时间
})

// 请求拦截器
request.interceptors.request.use(
	config => {
		// 在发送请求之前做些什么
		console.log('发送请求:', config.method?.toUpperCase(), config.url)
		console.log('当前环境:', import.meta.env.MODE)
		console.log('API基础地址:', import.meta.env.VITE_API_BASE_URL)

		// 可以在这里添加 token
		const token = localStorage.getItem('token')
		if (token && !config.headers.Authorization) {
			config.headers.Authorization = `Bearer ${token}`
		}

		return config
	},
	error => {
		// 对请求错误做些什么
		console.error('请求错误:', error)
		return Promise.reject(error)
	}
)

//封装刷新 token 的方法
const refreshToken = async () => {
	const defaultParams = {
		refresh_token: localStorage.getItem('token'),
		scope: 'server'
	}

	// 合并传入的参数和默认参数
	request({
		url: '/admin/oauth2/token?grant_type=refresh_token',
		method: 'post',
		data: defaultParams,
		headers: {
			'Content-Type': 'application/x-www-form-urlencoded',
			// 鉴权参数 - Basic认证，需要将 username:password 进行base64编码
			'Authorization': 'Basic cGlnOnBpZw=='
		}
	}).then(res => {
		// 刷新成功，更新 token
		if(res.data.access_token) {
			localStorage.setItem('token', res.data.access_token)
		}
		if(res.access_token) {
			localStorage.setItem('token', res.access_token)
		}
	})
}

// 响应拦截器
request.interceptors.response.use(
	response => {
		// 对响应数据做点什么
		console.log('响应数据:', response, response.config.url)

		// 统一处理响应数据
		const { data } = response

		// 如果后端返回的数据结构是 { code, data, message }
		if (data.code === 0) {
			return data
		} else {
			// 业务错误
			const errorMessage = data.msg || '请求失败'
			Promise.reject(new Error(errorMessage))
			if (data.code === 424 || data.code === 401) {
				// 刷新 token
				refreshToken()
			}
		}

		// 直接返回数据
		return data
	},
	error => {
		// 对响应错误做点什么
		let errorMessage = '网络错误'

		if (error.response) {
			// 服务器返回了错误状态码
			const { status, data } = error.response

			switch (status) {
				case 400:
					errorMessage = data?.message || '请求参数错误'
					break
				case 401:
				case 424:
					errorMessage = '未授权，请重新登录'
					// 可以在这里清除 token 并跳转到登录页
					localStorage.removeItem('token')
					// 刷新 token
					refreshToken()
					break
				case 403:
					errorMessage = '拒绝访问'
					break
				case 404:
					errorMessage = '请求的资源不存在'
					break
				case 500:
					errorMessage = '服务器内部错误'
					break
				default:
					errorMessage = data?.message || `请求失败 (${status})`
			}
		} else if (error.request) {
			// 请求已发出但没有收到响应
			errorMessage = '网络连接超时'
		} else {
			// 其他错误
			errorMessage = error.message || '请求失败'
		}

		// 可以在这里显示错误提示
		// 例如使用 Element Plus 的 Message 组件
		// ElMessage.error(errorMessage)

		return Promise.reject(new Error(errorMessage))
	}
)

export default request